import mne
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist
from matplotlib.pyplot import MultipleLocator
def eeg_picture(raw):
    tmin = 100 - 5
    tmax = 100 + 5
    chans = ['F7', 'F5', 'F3', 'F1', 'FZ', 'F2', 'F4', 'F6', 'F8']
    selection = raw.crop(tmin, tmax)
    selection = selection.pick_channels(chans)

    sl = selection[:, :]  # 抽取为array格式
    offset = np.arange(0, 9 * 150, 150)
    x = sl[1]  # x轴数据
    y = sl[0].T + offset  # y轴数据

    ylabel = ['$F7$', '$F5$', '$F3$', '$F1$', '$FZ$', '$F2$', '$F4$', '$F6$', '$F8$']  # y轴刻度的名称
    fig = plt.figure()
    ax = axisartist.Subplot(fig, 111)
    fig.add_axes(ax)
    ax.axis["left"].set_axisline_style("->", size=1.5)  # 设置y轴样式为->箭头
    ax.axis["bottom"].set_axisline_style("->", size=1.5)  # 设置x轴样式为->箭头
    ax.axis["top"].set_visible(False)  # 隐藏上面的轴
    ax.axis["right"].set_visible(False)  # 隐藏右侧的轴
    x_major_locator = MultipleLocator(1)  # 设置刻度间距为1
    ax.xaxis.set_major_locator(x_major_locator)
    plt.yticks(offset.tolist(), ylabel)  # 修改y轴刻度的名称
    plt.xlabel("Time(s)")
    plt.ylabel("Channels")
    plt.axvline(5, linestyle="dotted", color='k')  # 在x=5的地方画垂直点状线
    plt.text(5.17, 1400, "Seizure")  # 在x=5.17,y=0.02处写上Seizure字样
    plt.plot(x, y, '-k', linewidth=0.5)  # 设置线条颜色、宽度
    plt.savefig("images/" + "波形图.png")


import matplotlib.pyplot as plt
import numpy as np


def plot_prediction_probabilities3(class1_prob, class2_prob, class3_prob, labels=['Class 1', 'Class 2', 'Class 3']):
    """
    绘制带有数值标签的三类别预测概率条形图，只在一个柱子上显示数值。

    参数:
    class1_prob (float): 第一类别的预测概率。
    class2_prob (float): 第二类别的预测概率。
    class3_prob (float): 第三类别的预测概率。
    labels (list, 可选): 类别标签列表。
    """

    # 确保概率总和为1（如果不是，则进行归一化）
    probs = np.array([class1_prob, class2_prob, class3_prob])
    probs_normalized = probs / probs.sum()

    # 创建条形图的索引位置和宽度
    ind = np.arange(len(probs_normalized))
    width = 0.7  # 设置条形图的宽度，可以根据需要调整

    # 绘制条形图
    fig, ax = plt.subplots()
    bars = ax.bar(ind, probs_normalized, width, align='center')

    # 只在一个柱子上添加数值标签，例如中间的柱子
    n=len(bars)
    for n in range(3):
        middle_bar = bars[n]
        height = middle_bar.get_height()
        ax.annotate('{}%'.format(round(height * 100,1)),
                    xy=(middle_bar.get_x() + middle_bar.get_width() / 2, height),
                    xytext=(0, 3),  # 3 points vertical offset
                    textcoords="offset points",
                    ha='center', va='bottom')

        # 设置坐标轴标签和标题
    ax.set_xlabel("Emotional Category")
    ax.set_ylabel('Probability')
    ax.set_title('Emotion Prediction Result Graph')
    ax.set_xticks(ind)
    ax.set_xticklabels(labels)
    ax.set_ylim(0, 1.1)  # 调整y轴的范围以便更好地显示
    ax.tick_params(axis='y', which='major', labelsize=10)  # 调整y轴刻度标签大小

    # 去掉顶部和右侧的边框线
    ax.spines['right'].set_visible(False)
    ax.spines['top'].set_visible(False)

    # 显示网格线
    plt.grid(axis='y', linestyle='--', linewidth=0.5, color='gray', alpha=0.5)

    # 显示图形
    plt.tight_layout()  # 自动调整子图参数，使之填充整个图像区域
    plt.savefig("images/" + "预测结果.png")


# 示例使用
class1_prob = 0.01
class2_prob = 0.776
class3_prob = 0.214
plot_prediction_probabilities3(class1_prob, class2_prob, class3_prob,labels=['a','b','c'])

def plot_prediction_probabilities2(class1_prob, class2_prob, labels=['Class 1', 'Class 2']):
    """
    绘制带有数值标签的三类别预测概率条形图，只在一个柱子上显示数值。

    参数:
    class1_prob (float): 第一类别的预测概率。
    class2_prob (float): 第二类别的预测概率。
    class3_prob (float): 第三类别的预测概率。
    labels (list, 可选): 类别标签列表。
    """

    # 确保概率总和为1（如果不是，则进行归一化）
    probs = np.array([class1_prob, class2_prob])
    probs_normalized = probs / probs.sum()

    # 创建条形图的索引位置和宽度
    ind = np.arange(len(probs_normalized))
    width = 0.7  # 设置条形图的宽度，可以根据需要调整

    # 绘制条形图
    fig, ax = plt.subplots()
    bars = ax.bar(ind, probs_normalized, width, align='center')

    # 只在一个柱子上添加数值标签，例如中间的柱子
    n=len(bars)
    for n in range(2):
        middle_bar = bars[n]
        height = middle_bar.get_height()
        ax.annotate('{}%'.format(round(height * 100,1)),
                    xy=(middle_bar.get_x() + middle_bar.get_width() / 2, height),
                    xytext=(0, 3),  # 3 points vertical offset
                    textcoords="offset points",
                    ha='center', va='bottom')

        # 设置坐标轴标签和标题
    ax.set_xlabel("Emotional Category")
    ax.set_ylabel('Probability')
    ax.set_title('Emotion Prediction Result Graph')
    ax.set_xticks(ind)
    ax.set_xticklabels(labels)
    ax.set_ylim(0, 1.1)  # 调整y轴的范围以便更好地显示
    ax.tick_params(axis='y', which='major', labelsize=10)  # 调整y轴刻度标签大小

    # 去掉顶部和右侧的边框线
    ax.spines['right'].set_visible(False)
    ax.spines['top'].set_visible(False)

    # 显示网格线
    plt.grid(axis='y', linestyle='--', linewidth=0.5, color='gray', alpha=0.5)

    # 显示图形
    plt.tight_layout()  # 自动调整子图参数，使之填充整个图像区域
    plt.savefig("images/" + "预测结果.png")


# 示例使用
class1_prob = 0.224
class2_prob = 0.776

plot_prediction_probabilities2(class1_prob, class2_prob,labels=['a','c'])



